package com.empsys.old.aspects;

import com.empsys.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * @author wzm
 * @create 2023-12-18 9:20
 * project_name:web2310
 * @Description
 */
//连接点的测试
// 在通知的方法上我们经常会给一个形参来获取连接点的相关信息
//处理@Around上面形参使用ProceedingJoinPoint  其他同时用JoinPoint即可


//@Aspect
//@Component
@Slf4j
public class JoinPointTest {
    @Pointcut("@annotation(com.empsys.old.anno.MyAsp)")
    private void pt(){

    }

    //前置通知
    @Before("pt()")
    public void before(JoinPoint jp){

    }

    @After("pt()")
    public void after(JoinPoint jp){
        //其他通知获取信息用法都一样
        jp.getTarget().getClass().getName();
        jp.getSignature().getName();
        jp.getArgs();


    }

    @Around("pt()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        //获取目标对象类名 增强方法的调用者
        String name = pjp.getTarget().getClass().getName();
        log.info("目标类名：{}",name);

        //获取目标方法名
        String method = pjp.getSignature().getName();
        log.info("目标对象的方法名{}",method);

        //获取目标方法参数
        Object[] args = pjp.getArgs();
        log.info("目标方法的参数：{}", Arrays.toString(args));

        //执行目标方法
        Object result = pjp.proceed();
        log.info("目标方法的返回值{}",result);


        //获取目标方法返回值并返回
        return result;
    }
}
